1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include <cstdio> #define int long long const int maxn = 2005; const int mo = 924844033; using namespace std; int f[maxn][maxn][2], g[2][maxn], n, k; int fac[maxn]; signed main(){ scanf("%lld%lld", &n, &k); fac[0] = 1; for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % mo; f[1][0][0] = 1; for (int i = 1; i <= n / k; i++){ for (int j = 0; j <= i / 2; j++){ f[i + 1][j][0] = (f[i][j][1] + f[i][j][0]) % mo; f[i + 1][j + 1][1] = f[i][j][0]; } } g[0][0] = 1; int cnt = 0;
int T = 0; for (int s = 1; s <= k; s++){ int len = (n - s) / k + 1; for (int i = 0; i <= cnt; i++) for (int j = 0; j <= len / 2; j++) g[T ^ 1][i + j] = (g[T ^ 1][i + j] + 1ll * g[T][i] * (f[len][j][0] + f[len][j][1]) % mo) % mo; for (int i = 0; i <= cnt; i++) g[T][i] = 0; T ^= 1; cnt += len / 2; for (int i = 0; i <= cnt; i++) for (int j = 0; j <= len / 2; j++) g[T ^ 1][i + j] = (g[T ^ 1][i + j] + 1ll * g[T][i] * (f[len][j][0] + f[len][j][1]) % mo) % mo; for (int i = 0; i <= cnt; i++) g[T][i] = 0; T ^= 1; cnt += len / 2; } int ans = 0; for (int i = 0; i <= n; i++) ans = (ans + mo + ((i & 1) ? -1 : 1) * 1ll * g[T][i] % mo * fac[n - i] % mo) % mo; printf("%lld\n", ans); return 0; }
|